package com.xjh.service.studyjava.testjuc.sync;

import java.util.concurrent.TimeUnit;

class Phone {

    public static synchronized void sendSMS() throws Exception {
        //停留4秒
        TimeUnit.SECONDS.sleep(4);
        System.out.println("------sendSMS");
    }

    public synchronized void sendEmail() throws Exception {
        System.out.println("------sendEmail");
    }

    public void getHello() {
        System.out.println("------getHello");
    }
}

/**
 * @Description: 8锁问题
 * 有一个类：里面有短信方法被调用后sleep了4秒才执行（同步方法）、邮件方法（同步方法）、hello普通方法
 * 条件：创建两个线程，先执行短信方法，sleep100毫秒后，执行邮件方法
 *
 *
1 标准访问（同一phone对象，先访问短信，再访问邮件），先打印短信还是邮件（synchronized锁的是当前对象，同一对象中，必须得等某个加同步的方法先执行完后，才执行另一个加同步的）
------sendSMS
------sendEmail

2 停4秒在短信方法内，先打印短信还是邮件（同上）
------sendSMS
------sendEmail

3 新增普通的hello方法，是先打短信还是hello（hello没加锁，短信等待了四秒，所以先执行hello）
------getHello
------sendSMS

4 现在有两部手机（创建两个phone对象），先打印短信还是邮件（因为是不同对象，同步锁的范围是对象，所以不是同一把锁，所以先输出邮件）
------sendEmail
------sendSMS

5 两个静态同步方法，1部手机，先打印短信还是邮件（加了static后，同步锁锁住了整个类class，不管有几个对象，同步方法都得按顺序执行）
------sendSMS
------sendEmail

6 两个静态同步方法，2部手机，先打印短信还是邮件（同上）
------sendSMS
------sendEmail

7 1个静态同步方法,1个普通同步方法，1部手机，先打印短信还是邮件（不是同一把锁，static是类锁，同步锁是方法锁，所以邮件先执行完成）
------sendEmail
------sendSMS

8 1个静态同步方法,1个普通同步方法，2部手机，先打印短信还是邮件（同上）
------sendEmail
------sendSMS

 */

public class Lock_8 {
    public static void main(String[] args) throws Exception {

        Phone phone = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "AA").start();

        Thread.sleep(100);

        new Thread(() -> {
            try {
               // phone.sendEmail();
               // phone.getHello();
                phone2.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "BB").start();
    }
}
